/**
 * obj=[{
 *     datetime:'日期',
 *     hours:[{
 *         temperature:'体温',
 *         reductionTemperature:'物理降温后',
 *         breathe:'呼吸',
 *         breatheType:'辅助呼吸',
 *         pulse:'脉搏',
 *         heartRate:'心率',
 *         topMark:'上标',
 *         bottomMark:'下标',
 *         isinterrupt:'中断',
 *         nurseNode:'事件'
 *     }],
 * }]
 * @type {{bodyTemperature(*): string, pulse(*): string, breathe(*): string}}
 */
var zrender = window.zrender;
var TCHART_CONFIG = window.TCHART_CONFIG;
var Tdata = {
  //体温
  bt_lines: [],
  bt_data: [],

  //脉搏、心率
  pulse_lines: [],
  pulse_data: [],
  heart_lines: [],
  heart_data: [],

  //呼吸
  breathe_lines: [],
  breathe_data: []
}
const Tchart = {
  init: function (obj, zr, enabled) {
    const [height, width] = [TCHART_CONFIG.INIT_HEIGHT, TCHART_CONFIG.INIT_WIDTH]
    const tableGroup = new zrender.Group()
    //横向Line
    const longitudinal = TCHART_CONFIG.Y_MIN_UNIT * TCHART_CONFIG.Y_MAX_UNIT - 3
    const transverse = TCHART_CONFIG.DAYS * TCHART_CONFIG.HOUR
    for (let i = 0; i <= longitudinal; i++) {
      let lineTobj = { stroke: '#000', lineWidth: 1 }
      if (i % 5 - 2 === 0 && i !== 0) {
        lineTobj = { stroke: '#000', lineWidth: 0.8 }
      } else if (i !== 0) {
        lineTobj = { stroke: '#33CCFF', lineWidth: 0.8 }
      }
      if (i === TCHART_CONFIG.Y_MIN_UNIT * 5 + 2) {
        lineTobj = { stroke: '#f00', lineWidth: 1 }
      }
      const lineT = new zrender.Line({
        shape: {
          x1: 0,
          y1: height * i,
          x2: width * transverse,
          y2: height * i
        },
        style: {
          stroke: lineTobj.stroke,
          lineWidth: lineTobj.lineWidth
        }
      })
      tableGroup.add(lineT)
    }
    //纵向Line
    const hour = TCHART_CONFIG.HOUR //时段
    for (let i = 0; i <= transverse; i++) {
      let lineLobj = { stroke: '#000', lineWidth: 0.8 }
      if (i % hour === 0 && i !== 0 && i !== transverse) {
        lineLobj = { stroke: '#FF0000', lineWidth: 2.5 }
      } else if (i !== 0 && i !== transverse) {
        lineLobj = { stroke: '#33CCFF', lineWidth: 0.8 }
      }
      const lineL = new zrender.Line({
        shape: {
          x1: width * i,
          y1: 0,
          x2: width * i,
          y2: height * longitudinal
        },
        style: {
          stroke: lineLobj.stroke,
          lineWidth: lineLobj.lineWidth
        }
      })

      tableGroup.add(lineL)
    }
    TCHART_CONFIG.INIT_X = enabled.x ? enabled.x : 0
    TCHART_CONFIG.INIT_Y = enabled.y ? enabled.y : 0
    tableGroup.attr('position', [TCHART_CONFIG.INIT_X, TCHART_CONFIG.INIT_Y])
    zr.add(tableGroup)

    Tdata = {
      //体温
      bt_lines: [],
      bt_data: [],

      //脉搏、心率
      pulse_lines: [],
      pulse_data: [],
      heart_lines: [],
      heart_data: [],

      //呼吸
      breathe_lines: [],
      breathe_data: []
    }
    /***************************** 体温、脉搏、呼吸 ****************************/
    for (let i = 0; i < obj.tbData.length; i++) {
      const day = obj.tbData[i]//获取day数据
      let _date = -1
      for (let x = 0; x < obj.days.length; x++) {
        const d = obj.days[x]
        if (d === day.datetime) {
          _date = x
        }
      }
      if (_date === -1) {
        continue
      }
      var hous = obj.hours[0]
      for (var j = 0; j < day.hours.length; j++) {
        const h = day.hours[j]
        h['hours'] = Number(hous)
        hous = Number(hous)
        hous += obj.hours[1] - obj.hours[0]
        const _x = this.x(_date, j)
        if (enabled.btEnabled) {
          this.ptmBT(h, _x, zr)
        }
        if (enabled.pulseEnabled) {
          this.ptmPulse(h, _x, zr)
        }
        if (enabled.breatheEnabled) {
          this.ptmBreathe(h, _x, zr)
        }
        if (enabled.nurseEventEnabled) {
          this.nurseEvent(h, _x, zr)
        }
      }
    }
    if (enabled.btEnabled) {
      this.bodyTemperature(Tdata, zr)
    }
    if (enabled.pulseEnabled) {
      this.pulse(Tdata, zr)
    }
    if (enabled.breatheEnabled) {
      this.breathe(Tdata, zr)
    }
  },
  /**
     * 体温
     * （1）40℃－42℃之间的记录：应当用红色笔在40℃－42℃之间纵向填写患者入院、转入、手术、分娩、出院、死亡等。
     *     除手术不写具体时间外，其余均按24小时制，精确到分钟。转入时间由转入科室填写，死亡时间应当以“死亡于X时X分”的方式表述。
     * （2）体温符号：口温以蓝“●”表示，腋温以蓝“×”表示，肛温以蓝“○”表示。
     * （3）每小格为0.2℃，按实际测量度数，用蓝色笔绘制于体温单35℃－42℃之间，相邻温度用蓝线相连。
     * （4）体温不升时，可将“不升”二字写在35℃线以下。
     * （5）物理降温30分钟后测量的体温以红圈“○”表示，划在物理降温前温度的同一纵格内，以红虚线与降温前温度相连。
     * ******坐标X=初始X+时段下标*最小单元格宽度【width】+天数下标*6【时段】+width/2
     * ******坐标Y=9【43-34℃ 分为9格】*5【每格5小格】*最小单元格高度【height】 - (当前体温-34)*5【每℃分为5小格】*时段下标*最小单元格高度【height】
     * @param obj:{}
     * @returns {string}
     */
  ptmBT: function (data, _x, zr) {
    const h = data
    if (!h.temperature) {
      return false
    }
    const _y = this.y(h.temperature - 34)
    Tdata.bt_lines.push({ x: _x, y: _y, flag: h.isinterrupt })//1=正常;2=外出 todo 处理外出等事件不进行连线

    //脉搏与体温相遇
    if ((h.pulse - 40) / 4 * 0.2 + 34 === h.temperature) { //（当前血压-血压最小值）/血压的最小刻度单位*体温的最小刻度单位+体温最小值==当前体温
    } else if (h.temperature !== '' && h.pulse) {
      Tdata.bt_data.push({ x: _x, y: _y, txt: `体温(℃)：${h.temperature}\n脉搏(次/分)：${h.pulse}\n时间：${h.hours}:00`, data: h.temperature })
    } else {
      Tdata.bt_data.push({ x: _x, y: _y, txt: `体温(℃)：${h.temperature}`, data: h.temperature })
    }
    //物理降温处理
    if (h.reductionTemperature) {
      // eslint-disable-next-line camelcase
      const down_y = this.y(h.reductionTemperature - 34)
      // eslint-disable-next-line camelcase
      const bt_down_line = new zrender.Line({
        shape: {
          x1: _x,
          y1: _y,
          x2: _x,
          y2: down_y
        },
        style: {
          stroke: '#FF0000',
          lineDash: [1, 4],
          lineWidth: 2
        }
      })
      zr.add(bt_down_line)
      zr.add(DrawUtil.drawHollowCircle({ x: _x, y: down_y, txt: `降温后(℃)：${h.reductionTemperature}` }, '#FF0000'))
    }
  },
  bodyTemperature: function (data, zr) {
    //先画线 后画点
    this.relevanceLine(data.bt_lines, zr, '#0000FF')
    for (let i = 0; i < data.bt_data.length; i++) {
      var d = data.bt_data[i]
      var lastd
      zr.add(DrawUtil.drawX({ x: d.x, y: d.y, txt: d.txt }, '#0000FF')) //todo 处理腋温/肛温
      if (data.bt_data[i - 1]) {
        lastd = data.bt_data[i - 1].data
      }
      if (d.data - lastd >= 1.5 || lastd - d.data >= 2) { //体温逐升1.5或逐降2显示v
        zr.add(DrawUtil.drawV({ x: d.x, y: d.y, txt: '请进行复测' }, '#ff0000')) //处理体温差距过大时
      }
    }
  },

  /**
     * 脉搏
     * （1）脉搏符号：以红点“●”表示，每小格为4次/分，相邻的脉搏以红直线相连。心率用红“○”表示，两次心率之间也用红直线相连。
     * （2）脉搏与体温重叠时，先划体温符号，再用红色笔在体温符号外划“○”。
     * @param obj:{}
     * @param zr
     */
  ptmPulse: function (data, _x, zr) {
    const h = data
    if (!h.pulse) {
      return false
    }
    const _y = this.y((h.pulse - 20) / 20)
    Tdata.pulse_lines.push({ x: _x, y: _y, flag: h.isinterrupt })//1=正常;2=外出 todo 处理外出等事件不进行连线
    //脉搏与体温相遇
    if ((h.pulse - 40) / 4 * 0.2 + 35 === Number(h.temperature)) { //（当前血压-血压最小值）/血压的最小刻度单位*体温的最小刻度单位+体温最小值==当前体温
      Tdata.pulse_data.push({
        x: _x,
        y: _y,
        txt: `脉搏（次/分）：${h.pulse}\n体温(℃)：${h.temperature}\n时间：${h.hours}:00`,
        dataAnalysis: {
          coincide: true
        }
      })
    } else if (h.temperature !== '' && h.temperature && h.pulse) {
      Tdata.pulse_data.push({
        x: _x,
        y: _y,
        txt: `脉搏(次/分)：${h.pulse}\n体温(℃)：${h.temperature}\n时间：${h.hours}:00`,
        dataAnalysis: {
          coincide: false
        }
      })
    } else {
      Tdata.pulse_data.push({
        x: _x,
        y: _y,
        txt: `脉搏(次/分)：${h.pulse}`,
        dataAnalysis: { coincide: false }
      })
    }
    //心率
    if (h.heartRate) {
      // eslint-disable-next-line camelcase
      const heart_y = this.y((h.heartRate - 20) / 20)
      //当体温、脉搏、心率相遇时画⭕x
      if ((h.pulse - 40) / 4 * 0.2 + 35 === Number(h.temperature) && Number(h.temperature) === (h.heartRate - 40) / 4 * 0.2 + 35) {
        Tdata.pulse_data.push({
          x: _x,
          y: _y,
          txt: `脉搏（次/分）：${h.pulse}\n心率（次/分）：${h.heartRate}\n体温(℃)：${h.temperature}\n时间：${h.hours}:00`,
          dataAnalysis: {
            coincide: true
          }
        })
      } else {
        //由于是空心圆  所以需要先画线 后画点
        Tdata.heart_lines.push({ x: _x, y: heart_y, flag: h.isinterrupt })
        Tdata.heart_data.push({ x: _x, y: heart_y, txt: `心率：${h.heartRate}` })
      }
      //脉搏与心率不一致时 房颤处理 红色虚线相连
      if (h.heartRate !== h.pulse) {
        // eslint-disable-next-line camelcase
        const pulse_heart_line = new zrender.Line({
          shape: {
            x1: _x,
            y1: _y,
            x2: _x,
            y2: heart_y
          },
          style: {
            stroke: '#FF0000',
            lineDash: [1, 2],
            lineWidth: 2
          }
        })
        zr.add(pulse_heart_line)
      }
    }
  },
  pulse: function (data, zr) {
    //先画线 后画点
    this.relevanceLine(data.pulse_lines, zr, '#FF0000')
    for (let i = 0; i < data.pulse_data.length; i++) {
      var d = data.pulse_data[i]
      if (d.dataAnalysis.coincide) {
        zr.add(DrawUtil.drawHollowCircle({ x: d.x, y: d.y, txt: d.txt }, '#FF0000'))
        zr.add(DrawUtil.drawX({ x: d.x, y: d.y, txt: d.txt }, '#0000FF'))
      } else {
        zr.add(DrawUtil.drawCircle({ x: d.x, y: d.y, txt: d.txt }, '#FF0000'))
      }
    }

    if (data.heart_lines) {
      // this.relevanceLine(data.heart_lines, zr, '#FF0000')
      for (let i = 0; i < data.heart_data.length; i++) {
        var heart = data.heart_data[i]
        zr.add(DrawUtil.drawHollowCircle({ x: heart.x, y: heart.y, txt: heart.txt }, '#FF0000'))
      }
    }
  },

  /**
     * 呼吸
     * （1）用红色笔以阿拉伯数字表述每分钟呼吸次数。
     * （2）如每日记录呼吸2次以上，应当在相应的栏目内上下交错记录，第1次呼吸应当记录在上方。
     * （3）使用呼吸机患者的呼吸以○R表示，在体温单相应时间内呼吸30次横线下顶格用黑笔画○R。
     * @param obj
     * @param zr
     */
  ptmBreathe: function (data, _x, zr) {
    const h = data
    if (!h.breathe) {
      return false
    }
    const _y = this.y((h.breathe - 10) / 10)
    Tdata.breathe_lines.push({ x: _x, y: _y, flag: h.isinterrupt })//1=正常;2=外出 todo 处理外出等事件不进行连线
    Tdata.breathe_data.push({ x: _x, y: _y, breathe: h.breathe, breatheType: h.breatheType })
  },
  breathe: function (data, zr) {
    //先画线 后画点
    this.relevanceLine(data.breathe_lines, zr, '#000')
    for (let i = 0; i < data.breathe_data.length; i++) {
      var breathe = data.breathe_data[i]
      if (breathe.breatheType) {
        zr.add(DrawUtil.drawXCircle({ x: breathe.x, y: breathe.y, text: 'R', txt: 'R' }, '#000'))
      } else {
        zr.add(DrawUtil.drawCircle({ x: breathe.x, y: breathe.y, txt: breathe.breathe }, '#000'))
      }
    }
  },

  /**
     * 护理事件 如：入院、转入、手术、分娩、出院、死亡等
     * 除手术不写具体时间外，其余均按24小时制，精确到分钟。
     * 入院于十时十六分
     * @param obj
     * @param zr
     */
  nurseEvent: function (data, _x, zr) {
    const h = data
    if (h.topMark) {
      const _y = TCHART_CONFIG.INIT_Y
      zr.add(DrawUtil.drawText({
        x: _x,
        y: _y + TCHART_CONFIG.INIT_HEIGHT * 2 + 3,
        text: h.topMark,
        fontSize: 12,
        textAlign: 'center',
        textPosition: 'top',
        lineHeight: '16'
      }, 'L', '#FF0000'))
    }
    if (h.bottomMark) {
      // const _y = TCHART_CONFIG.INIT_Y + TCHART_CONFIG.Y_MIN_UNIT * TCHART_CONFIG.INIT_HEIGHT * 8 + 2
      const _y = (TCHART_CONFIG.INIT_Y + TCHART_CONFIG.INIT_HEIGHT * 2 + 3) + (TCHART_CONFIG.Y_MIN_UNIT * TCHART_CONFIG.INIT_HEIGHT * 7)
      zr.add(DrawUtil.drawText({
        x: _x,
        y: _y,
        text: h.bottomMark,
        fontSize: 14,
        textAlign: 'center',
        textPosition: 'bottom'
      }, 'L', '#000'))
    }
  },

  /**
     * 点对点连线  直线
     * @param bt_lines
     * @param zr
     */
  // eslint-disable-next-line camelcase
  relevanceLine: function (bt_lines, zr, color) {
    for (let i = 0; i < bt_lines.length; i++) {
      const line = bt_lines[i]
      if ((i + 1) < bt_lines.length) {
        // eslint-disable-next-line camelcase
        const line_next = bt_lines[i + 1]
        if (!line_next.flag) { //正常情况才可连线`
          // eslint-disable-next-line camelcase
          const bt_line = new zrender.Line({
            shape: {
              x1: line.x,
              y1: line.y,
              x2: line_next.x,
              y2: line_next.y
            },
            style: {
              stroke: color,
              lineWidth: 2
            }
          })
          zr.add(bt_line)
        }
      }
    }
  },

  /**
     * 获取x坐标
     * @param day_sub 日期下标
     * @param hours_sub 时段下标
     * @returns {number}
     */
  // eslint-disable-next-line camelcase
  x: function (day_sub, hours_sub) {
    // eslint-disable-next-line camelcase
    return TCHART_CONFIG.INIT_X + hours_sub * TCHART_CONFIG.INIT_WIDTH +
    // eslint-disable-next-line camelcase
            day_sub * TCHART_CONFIG.HOUR * TCHART_CONFIG.INIT_WIDTH +
            TCHART_CONFIG.INIT_WIDTH / 2
  },

  /**
     * 获取y坐标
     * @param value 以一大格为单位
     * @returns {number}
     */
  y: function (value) {
    return TCHART_CONFIG.INIT_Y - (TCHART_CONFIG.INIT_HEIGHT * 3) + TCHART_CONFIG.Y_MAX_UNIT * TCHART_CONFIG.Y_MIN_UNIT * TCHART_CONFIG.INIT_HEIGHT -
            value * TCHART_CONFIG.Y_MIN_UNIT * TCHART_CONFIG.INIT_HEIGHT
  }
}
